<?php
/**
 * Created by phpstrom.
 * User:wangyahe
 * Date: 2017/6/17
 * Time: 10:23
 */
//-------------- 一：首先是完成微信关键词的联通回复：
//一般的有关微信的回复消息什么的都是到WeChat的api的handler方法中设置，然后在测试的时候是到module\base\system\Processor中进行设定
//即是微信的---微信连接配置：是系统配置，所以在WeChat\controller\config中进行设置；
//因为微信的消息回复也要进数据库所以要在微信的系统配置的表中进行添加字段：
//	在config表中添加字段wechat_is_system();
//首先是设计模板，然后将进行数据的添加编辑，然后进数据库；
//所以在WeChat\config\system的配置项中进行添加编辑的操作：
//public function post(){
	//然后这种昂只有一个字段的只要看是否能监测到一条数据即可；
//	$wechat_is_system=\system\model\Config::find(1) ? : new Config();
//	如果进行了post提交
//	if(IS_POST){
		//获得post提交的数据
//		$post=\houdunwang\request\Request::post();
		//然后将post提交的数据进传递进去，进行修改数据对象---这里注意的是要存储的数据进行编码为字符串
//		$wechat_is_system->wechat_is_system=json_encode($post,JSON_UNESCAPED_UNICODE);
		//然后将数据保存到数据库中
//		$wechat_is_system->save();
		//然后进行成功的提示
//		$this->setRedirect('refresh')->success('操作成功');
//	}
	//获得旧数据
//	$field=json_decode($wechat_is_system,true);
	//将旧数据分配变量
//	return view('',compact('field'));
//}

//-------------------------------通过上面的post函数就可以将数据进行传递到数据库了，然后也可以将数据显示到页面上了；
//那接下来就是将这些微信的消息能够真正的发给粉丝了；在这里的与微信的对接的操作要在wechat\api\handler中进行；还有自己的processor中进行
//2.到app\wechat\controller\api里面：
//public function handler(){-------------handler中做的是实例化具体的类以及类中的方法的；然后还有就是真正进行操作的是Processor这个类来进行测试与操作；
	//实例化微信中的message类
//	$instence=\houdunwang\wechat\WeChat::instance('message');
	//然后获得分析发来的消息
//	$content=$instence->Content();
	//在这里就可以测试一下看是否联通了微信了
//	$instence->text($content);//这句话是回复给粉丝粉丝发来的内容
	//然后就是通过粉丝发来的内容去关键字的表格中看是否有与之对应的关键字---然后再通过关键字表格中国的module_id去basecontent的表格中查找是否有预知对应的回复内容
//	$keywordsmodel=\system\model\Keywords::where('keywords',$content)->first();
	//如果能够找到就实例化类，所以下面主要做的就是实例化类
//	if($keywordsmodel){
		//通过关键字中的'module'字段来对应module表中的module_name字段，然后找到module_is_system的字段
//		$module_is_system=\system\model\Module::where('module_name',$keywordsmodel['module'])->pluck('module_is_system');
		//然后就是实例化类，就是拼接好路径的名字即可
//		$class=($module_is_system==1?'module':'addons')."\\".$keywordsmodel['module'].'\system\Processor';
		//拼接后要实例化的类的路径后就要实例化这个类，并将要实例化的勒种的方法进行返回，还有就是要穿的参数因为这里是要实例化类后要查找basecontent中的content所以要将module_id进行传递过去；
//		return call_user_func_array([new $class,'handler'],[]);
//	}
//}//handler 类结束；
//然后进入到module\base\system\processor中进行操作;
//class Processor{
//	public function handler($module_id){
		$content=\module\base\model\BaseContent::find($module_id)->pluck('content');
//		$instance=\houdunwang\wechat\WeChat::instance('message');这部分内容提到__call()函数中
//		$instance->text($content);
//	}
//}
//这样就可以将粉丝发来的消息进行回复了；还有就是这里为了简便还可以进行简化和封装；所以可能会恢复一些图文消息或是语音消息，so这里可以通过__call()函数--当一个函数找不到的时候会自动触发这个函数
//所以这个__call()函数可以在父类中进行创造；
//so module\HdProcessor;
//class HdProcessor{
	/*
	 * $name:是没有找到的函数名，$arguments是要传递的参数
	 */
//	public function __call($name, $arguments)
//	{
//		 TODO: Implement __call() method.
//		$instance=\houdunwang\wechat\WeChat::instance('message');
//		return call_user_func_array([new $instance,$name],[current($arguments)]);
//	}
//}
//所以要在base\system\Processor中要继承父类Hdprocessor；

//---------------------还有就是要进行微信的系统恢复，因为是系统恢复多所以会在app\wechat\api中进行微信的连接设定
//然后就是在app\wechat\system的controller里
//class system{
//	public function index(){
		//	这里就要到config的表格中，添加字段为wechat_system_response；

		//这里就是判断是否是能够进行查到数据
//	     $wechat_system_response=Config::find(1) ? :new Config();
	     //然后就是如果进行了post提交
//		if(IS_POST){
			//1.获得post提交的数据
//			$post=\houdunwang\request\Request::post();
			//2.更新
//			$wechat_system_response->wechat_system_response=Json_encode($post,JSON_UNESCAPED_UNICODE);
			//3.保存到数据库
//			$wechat_system_response->save();
			//4.进行成功提示
//			$this->setRedirect('refresh')->success('操作成功');
//		}
         //将查到的数据分配到模板中;还要进行解码
//		$field=JSON_decode($wechat_system_response,true);
//		return view('',compact('field'));
//	}
//}

//这样就实现了向数据库中保存数据和将数据进行分配到模板中
//然后就是和微信打通实现连接----所以要到APP\wechat\controller\api
//class api{
//	public function handler (){
		//这里要将一些共同的部分拿出来，再创建一个方法parsekeywords()函数
		//这里先写上公共的部分
//		$instance=\houdunwang\wechat\WeChat::instance('message');
//然后获得分析发来的消息
//		$content=$instance->Content();
//	$this->parsekeywords($content);
		//默认回复
		//在config表中回去字段为wechat_system_response值
//		$wechat_system_response= Config::find(1)->wechat_system_response;
		//将其转为数组格式
//		$wechat_system_response = json_decode($wechat_system_response,true);
		//获取默认回复的消息内容default_message
		//如果你默认回复消息，恰好是一个关键词，那么当你随便输入的时候，回复该关键词对应的内容
//		$this->parseKeywords($wechat_system_response['default_message']);
		//去除默认消息进行恢复给粉丝
//		$instance->text($wechat_system_response['default_message']);
//	}
	//然后为了简便，还可以进行封装
//	public function parsekeywords($content){
		//将粉丝发来的消息，原样回复回复，测试
		//$instance->text($content);
		//2.2在关键词表中根据关键词找模块，pluck是获取单一一个字段的值
		//$module = Keywords::where( 'keywords' , $content )->pluck( 'module' );
		//相当于：select name from student
//		$module = Keywords::where( 'keywords' , $content )->first();
//		if ( $module ) {
			//2.3模块表中查找2.2中的模块是不是系统模块
//			$module_is_system = Module::where( 'module_name' , $module['module'] )->pluck( 'module_is_system' );
			//$instance->text($module_is_system);
			//$class = "module\base\system\Processor"
			//$class = "addons\pic\system\Processor";
//			$class = ( $module_is_system == 1 ? 'module' : 'addons' ) . '\\' . $module['module'] . '\system\Processor';
//			return call_user_func_array( [ new $class , 'handler' ] , [$module['module_id']] );
//		}
//	}
//}
//然后就到了进行文章的关键字的部分了；
//首先就是将文章的关键词和微信的关键词进行关联：
//就是文章的关键词是文章的关键词，然后module_id是文章主键即arc_id,还有就是文章的模块换article了;
//$data = ['keywords'=>$post['arc_keyword'],'module_id'=>$arc_id,'module'=>'article'];
//然后将这些数据村导数据库中，这里的操作是在savekeywords()的方法中就是在wechat.php里面；注意这里要引入命名空间wechat
//还有就是要使用use wechat;
//然后就是到savekeywords()的方法中进行修改，原来是从get参数获得模块的名字，然后这里是进行判断，在文章那里有没有模块如果有就从这里获得模块的名字；
//因为这里也是与微信的关键字鱼贯所以在module的目录中创建一个article的模块目录，然后里面创建system\processor的控制器
//用来和微信进行对接
//class Processor extends HdProcessor{
//	public function handler($module_id){//注意的是这里的函数的调用是在api中间型调用的，然后参数也是从那里传过来的
//		然后这应该注意的是因为是文章的系统所以这里是要回复图文消息的
//		$data=\system\model\Article::find($module_id);
		//然后到框架中去搜索图文消息回复
//		$news=array(
//			array(
//				'title'=>$data['arc_title'],
//				'discription'=>$data['arc_description'],
//				'picurl'=>__ROOT__.'/'.$data['arc_thumb'],
//				'url'=>__ROOT__."/{$data['arc_id']}.html"
//			),
//		);
//		$this->news($news);
//	}
//}
//-----------------------注意的时还应该改一下api里面的设定;应该改为就是要是默认回复的消息敲好设定为文章或者回复消息的的关键字那就应该回复该关键字对应的内容
//然户下面就是备份与还原-------------------------------------------------------------------------------
//到框架中去搜索备份：
//还有就是再回复图文信息的时候是在：在手机上能够访问到一个url地址然后看是在手机端还是pc端。
//这个方法在home\entry里面的方法；
//还要注意的是这里在进行微信的配置链接的时候是在app\wechat\api\handler()的方法中的时候是这样判断的，就是如果是粉丝发送了消息后，那会根据粉丝发送的关键字到关键字的表格中进行寻找数据，如果能够找到就根据找到的数据到baseContent的表格中寻找关键字对应的回复内容，然后将回复的内容返回回去，如果是找不到数据就应该是回复的默认的消息，然后是到config的数据表中进行寻找wechat_system_response的字段内容的default_message的内容回复过去。这里还要进行判断的就是如果是回复的内容正好设置的是关键字的表格中的数据的时候那就应该还要将baseContent的表中的数据返回回去。所以这里还要调用一下parsekeywords的函数进行判断，然后实例化。

//然后还有就是一般的情况下在进行添加等操作的时候是要判断就是是否是系统模板还是自定义模板，因为这里要加载目录实例化类，然后要是系统的模块就从module\中去寻找，而如果是自定义模块就从addons\中去实例化。

//------然后还有就是app是一个框架自身的应用目录，而module是系统模块，addons是自定义模块；


//然后还有就是在app\wechat就是一个微信模块，然后再module\base也是一个微信模块；
//那就是因为app\wechat这个模块在整个项目中的其他地方要显示这个模块中的信息所以可以说这个模块是微信的一些公共的模块，然后微信中的其它小的模块是放到module\base的模块中的；

//这里一般关联的是keywords里面的kid,和module_id,还有就是module,还有就是basecontent里面的id,content，还有就是module表中的module_is_system，还有就是module_name字段。
//然后还有就是在config的模板中进行添加两个字段

//还有就是目录的介绍：
//module:------是系统模块
//addons:------是自定义模块
//pic[插件标识]
//|--controller
//            |--model
//            |--system
//                |--Processor.php  微信处理器
//|--template 模板目录
//所以一般的与微信相关的处理器就是：放到模块的system\Processor;,然后Processor的调用是通过app\wechat\api就进行实例化的；
//还有就是中间件中执行的是有：系统的配置项，微信的配置项这个配置项是在Config的配置项中进行的；
//然后就是登录验证是在Auth的配置项中进行的
//就像是中间件的使用方式：eg:登录验证的中间件；
//在原来的login中只是写入了一个调用中间件的方式，然后真正进行登录验证的代码是在common中进行的
//然后Auth的中间件是实现登录验证的配置项问题问题，
//还有就是在Config的配置项中写入的是系统的配置和微信的配置项。


//然后还有就是在module:中是有
//HdController:是系统模块中的公共控制器
//Hdprocessor:这里是微信处理器的公共处理器，一般是用来处理与微信的连接与回复的
//template：是模板文件目录

//插件设计功能：这部分内容是在下面实现的；
//|--生成基本目录机构和创建基本文件
//            |--验证
//            |--模块不能重复创建
//            |--生成基本目录结构
//            |--创建出基本文件
//        |--写入数据库



















































